home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 194_01 / compare.c < prev    next >
Text File  |  1985-11-13  |  3KB  |  141 lines

  1. /* [COMPARE.C of JUGPDS Vol.17]
  2. *****************************************************************
  3. *                                *
  4. *    Written by  Hakuo Katayose (JUG-CP/M No.179)        *
  5. *            49-114 Kawauchi-Sanjuunin-machi        *
  6. *            Sendai, Miyagi 980                          *
  7. *            Phone: 0222-61-3219                *
  8. *                                *
  9. *    Edited & tested by Y. Monma (JUG-C/M Disk Editor)       * 
  10. *                                *
  11. *****************************************************************
  12. */
  13.  
  14. /* compare - file comarison */
  15.  
  16. #include "stdio.h"
  17. #include "def.h"
  18.  
  19. #define LINES 4000
  20.  
  21. main(argc, argv)
  22. int    argc;
  23. char    *argv[];
  24.  
  25. {
  26.     char    inbuf1[BUFSIZ], inbuf2[BUFSIZ];
  27.     int    fd1, fd2;
  28.  
  29.     if (argc < 3) {
  30.         fprintf(STDERR, "Usage: cmp file1 file2\n");
  31.         exit();
  32.         }
  33.     else if (fopen(argv[1], inbuf1) == ERROR) {
  34.         fprintf(STDERR, "file1 open error!\n");
  35.         exit();
  36.         }
  37.     else if (fopen(argv[2], inbuf2) == ERROR) {
  38.         fprintf(STDERR, "file2 open error!\n");
  39.         exit();
  40.         }
  41.     else
  42.         compare(inbuf1, inbuf2);
  43.     fclose(inbuf1);
  44.     fclose(inbuf2);
  45. }
  46.  
  47.  
  48. /* compare - compare two files for equality */
  49.  
  50. compare(inbuf1, inbuf2)
  51. char    *inbuf1, *inbuf2;
  52.  
  53. {
  54.     char *lineptr[LINES], line[MAXLINE];
  55.     int  nlines, i, j, k, lineno, len;
  56.  
  57.     _allocp = NULL;
  58.     j = 0;
  59.     lineno = 0;
  60.     if ((nlines = readlines(lineptr, LINES, inbuf2)) > 0) {
  61.         while ((len = getlin(line, MAXLINE, inbuf1)) > 0) {
  62.             for (i = j; i < nlines; i++)
  63.                 if (equal(line, lineptr[i]) == YES)
  64.                     break;
  65.             if (i == nlines)
  66.                 printf("File1 %4d:%s\n", lineno, line);
  67.             else {
  68.                 for (k = j; k < i; k++) {
  69.                     printf("        ");
  70.                     printf("File2 %4d:%s\n",k,lineptr[k]);
  71.                     }
  72.                 j = i + 1;
  73.                 }
  74.             lineno++;
  75.             }
  76.         for (k = j; k < i; k++) {
  77.             printf("        ");
  78.             printf("File2 %4d:%s", k, lineptr[k]);
  79.             }
  80.         }
  81. }
  82.  
  83.  
  84. readlines(lineptr, maxlines, inbuf)
  85. char    *lineptr[], *inbuf;
  86. int    maxlines;
  87.  
  88. {
  89.     int    len, nlines;
  90.     char    *p, line[MAXLINE], *alloc();
  91.  
  92.     nlines = 0;
  93.     while ((len = getlin(line, MAXLINE,inbuf)) > 0) {
  94.         if (nlines >= maxlines)
  95.             return(-1);
  96.         else if ((p = alloc(len)) == NULL) {
  97.             fprintf(STDERR ,"allocation over.  p:%04x\n", p);
  98.             return(-1);
  99.             }
  100.         else {
  101.             line[len-1] = '\0';
  102.             strcpy(p, line);
  103.             lineptr[nlines++] = p;
  104.             }
  105.     }
  106.     return(nlines);
  107. }
  108.  
  109.  
  110. getlin(s, lim, iobuf)
  111. char    *s, *iobuf;
  112. int    lim;
  113.  
  114. {
  115.     char    *p;
  116.     int    c;
  117.  
  118.     p= s;
  119.     while (--lim > 0 && (c = getc(iobuf))!= CPMEOF && c != NEWLINE)
  120.         *s++ = c;
  121.     if (c == NEWLINE)
  122.         *s++ = c;
  123.     *s = EOS;
  124.     return(s-p);
  125. }
  126.  
  127. equal(s1, s2)
  128. char     *s1, *s2;
  129.  
  130. {
  131.     int    i;
  132.  
  133.     do {
  134.         while (isspace(*s1)) s1++;
  135.         while (isspace(*s2)) s2++;
  136.         if (*s1 == *s2 && *s1 == EOS)
  137.             return(YES);
  138.         } while (*s1++ == *s2++);
  139.     return(NO);
  140. }
  141.